package org.sosim.modelo.instrucao;

public abstract class Instrucao {
	
	private final int idInstrucao;
	private final long tempoEstimado;
	private long tempoRestante;
	private long tempoEmProcessamento;
	
	public Instrucao(int id, long duracao){
		this.idInstrucao = id;
		this.tempoEstimado = duracao;
		this.tempoRestante = duracao;
		this.tempoEmProcessamento = 0;
	}
	
	public abstract void executar(long timeSlice);
	public abstract void interromper();
	
	public long atualizarTempo(long timeSlice) {
		long resto = tempoRestante - timeSlice;
		this.tempoEmProcessamento += 
				(tempoRestante - timeSlice ) >= 0 ? timeSlice : tempoRestante;
		this.tempoRestante -= 
				(tempoRestante - timeSlice ) >= 0 ? timeSlice : tempoRestante;
		
		return resto > 0 ? 0 : -(resto) ;
	}
	
	public int getId() {
		return idInstrucao;
	}
	
	public long getTempoEstimado() {
		return tempoEstimado;
	}
	
	public long getTempoRestante() {
		return tempoRestante;
	}
	
	public long getTempoEmProcessamento() {
		return tempoEmProcessamento;
	}
	
	public boolean isCompleto(){
		return tempoRestante == 0;
	}
	
	public boolean hasDelta(){
		return (tempoEstimado - tempoEmProcessamento) > 0;
	}
	
	public long getDelta(){
		return isCompleto() ? (tempoEstimado - tempoEmProcessamento) : 0;
	}
	
}
